package io.github.echarts.option.component;

import io.github.echarts.option.abstracts.AbstractOption;
import io.github.echarts.option.component.axis.AxisLabel;
import io.github.echarts.option.component.axis.AxisLine;
import io.github.echarts.option.component.axis.AxisTick;
import io.github.echarts.option.component.axis.SplitLine;
import io.github.echarts.option.style.AxisStyle;

/**
 * 坐标轴配置。
 * 包含X轴、Y轴和极坐标系径向轴的共同配置。
 */
public class Axis extends AbstractOption {
    
    private static final long serialVersionUID = 1L;
    
    private String type;
    private String position;
    private Boolean show;
    private Object data;
    private AxisLine axisLine;
    private AxisLabel axisLabel;
    private AxisTick axisTick;
    private SplitLine splitLine;
    private AxisStyle axisStyle;
    private Boolean scale; // 是否是脱离 0 值比例。设置成 true 后坐标刻度不会强制包含零刻度
    private Object min; // 坐标轴最小值
    private Object max; // 坐标轴最大值
    private String name; // 坐标轴名称

    /**
     * 获取轴类型。
     * 可能的值：'value'（数值轴）, 'category'（类目轴）, 'time'（时间轴）, 'log'（对数轴）
     *
     * @return 轴类型
     */
    public String getType() {
        return type;
    }

    /**
     * 设置轴类型。
     *
     * @param type 轴类型
     * @return 当前实例，用于链式调用
     */
    public Axis setType(String type) {
        this.type = type;
        return this;
    }

    /**
     * 获取轴的位置。
     * 例如X轴可以是'top'或'bottom'，Y轴可以是'left'或'right'
     *
     * @return 轴位置
     */
    public String getPosition() {
        return position;
    }

    /**
     * 设置轴的位置。
     *
     * @param position 轴位置
     * @return 当前实例，用于链式调用
     */
    public Axis setPosition(String position) {
        this.position = position;
        return this;
    }
    
    /**
     * 获取是否显示坐标轴
     * 
     * @return 是否显示
     */
    public Boolean getShow() {
        return show;
    }
    
    /**
     * 设置是否显示坐标轴
     * 
     * @param show 是否显示
     * @return 当前实例，用于链式调用
     */
    public Axis setShow(Boolean show) {
        this.show = show;
        return this;
    }

    /**
     * 获取轴的数据数组。
     * 类目轴中该数组是类目列表。
     *
     * @return 数据数组
     */
    public Object getData() {
        return data;
    }

    /**
     * 设置轴的数据数组。
     *
     * @param data 数据数组
     * @return 当前实例，用于链式调用
     */
    public Axis setData(Object data) {
        this.data = data;
        return this;
    }

    /**
     * 获取轴线相关配置。
     *
     * @return 轴线配置
     */
    public AxisLine getAxisLine() {
        return axisLine;
    }

    /**
     * 设置轴线相关配置。
     *
     * @param axisLine 轴线配置
     * @return 当前实例，用于链式调用
     */
    public Axis setAxisLine(AxisLine axisLine) {
        this.axisLine = axisLine;
        return this;
    }

    /**
     * 获取轴标签相关配置。
     *
     * @return 轴标签配置
     */
    public AxisLabel getAxisLabel() {
        return axisLabel;
    }

    /**
     * 设置轴标签相关配置。
     *
     * @param axisLabel 轴标签配置
     * @return 当前实例，用于链式调用
     */
    public Axis setAxisLabel(AxisLabel axisLabel) {
        this.axisLabel = axisLabel;
        return this;
    }

    /**
     * 获取轴刻度相关配置。
     *
     * @return 轴刻度配置
     */
    public AxisTick getAxisTick() {
        return axisTick;
    }

    /**
     * 设置轴刻度相关配置。
     *
     * @param axisTick 轴刻度配置
     * @return 当前实例，用于链式调用
     */
    public Axis setAxisTick(AxisTick axisTick) {
        this.axisTick = axisTick;
        return this;
    }

    /**
     * 获取分隔线相关配置。
     *
     * @return 分隔线配置
     */
    public SplitLine getSplitLine() {
        return splitLine;
    }

    /**
     * 设置分隔线相关配置。
     *
     * @param splitLine 分隔线配置
     * @return 当前实例，用于链式调用
     */
    public Axis setSplitLine(SplitLine splitLine) {
        this.splitLine = splitLine;
        return this;
    }
    
    /**
     * 获取轴样式
     * 
     * @return 轴样式
     */
    public AxisStyle getAxisStyle() {
        return axisStyle;
    }
    
    /**
     * 设置轴样式
     * 
     * @param axisStyle 轴样式
     * @return 当前实例，用于链式调用
     */
    public Axis setAxisStyle(AxisStyle axisStyle) {
        this.axisStyle = axisStyle;
        return this;
    }
    
    /**
     * 获取是否是脱离零值比例
     * 
     * @return 是否是脱离零值比例
     */
    public Boolean getScale() {
        return scale;
    }
    
    /**
     * 设置是否是脱离零值比例
     * 设置成 true 后坐标刻度不会强制包含零刻度
     * 
     * @param scale 是否是脱离零值比例
     * @return 当前实例，用于链式调用
     */
    public Axis setScale(Boolean scale) {
        this.scale = scale;
        return this;
    }
    
    /**
     * 获取坐标轴最小值
     * 
     * @return 坐标轴最小值
     */
    public Object getMin() {
        return min;
    }
    
    /**
     * 设置坐标轴最小值
     * 
     * @param min 坐标轴最小值
     * @return 当前实例，用于链式调用
     */
    public Axis setMin(Object min) {
        this.min = min;
        return this;
    }
    
    /**
     * 获取坐标轴最大值
     * 
     * @return 坐标轴最大值
     */
    public Object getMax() {
        return max;
    }
    
    /**
     * 设置坐标轴最大值
     * 
     * @param max 坐标轴最大值
     * @return 当前实例，用于链式调用
     */
    public Axis setMax(Object max) {
        this.max = max;
        return this;
    }
    
    /**
     * 获取坐标轴名称
     * 
     * @return 坐标轴名称
     */
    public String getName() {
        return name;
    }
    
    /**
     * 设置坐标轴名称
     * 
     * @param name 坐标轴名称
     * @return 当前实例，用于链式调用
     */
    public Axis setName(String name) {
        this.name = name;
        return this;
    }
}